package com.ys.web.sys.icon;

import com.ys.utils.base.http.ResponseHandler;
import com.ys.utils.base.j2se.JsonUtil;
import com.ys.utils.base.j2se.Logger;
import com.ys.utils.base.j2se.StringHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 图标管理器
 * 根据位置 和 端管理图标信息
 */
@Service
public class IconManager implements Runnable{

	@Autowired
	private IconService iconModel;
	/** 根据图表的 位置和端 存储图标分类列表 */
	private Map<String, List<IconClassify>> map = new HashMap<>();

	@PostConstruct
	public void init(){
		load();
		new Thread(this).start();
	}

	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(60000);
				load();
			} catch (InterruptedException e) {
				Logger.error("加载icon失败",e);
			}
		}
	}

	/**
	 * 通过key获取图标信息
	 * key是placeId+应用id组装成的
	 * @param key 图标信息的key
	 * @return 图标分类列表
	 */
	public List<IconClassify> get(String key){
		return map.get(key);
	}

	/**
	 * 通过 位置 端 角色 返回图标
	 * @param placeId 位置
	 * @param app 端
	 * @param role 角色
	 * @return
	 */
//	@RedisCache
	public String infoByRole(int placeId, int app, int role, int appVersion){
		//获取该位置该端的所有分类图标 不存在返回空
		List<IconClassify> iconClassifies = get(placeId + "_" + app);
		if(StringHandler.isEmpty(iconClassifies)){
			return ResponseHandler.list(new ArrayList<>());
		}
		//存在分类图标 遍历每一个图标验证图标角色权限
		IconClassify resCla;
		List<IconClassify> result = new ArrayList<IconClassify>();
		for(IconClassify iconClassify : iconClassifies){
			//分类存在图标列表才添加
			if(StringHandler.isEmpty(iconClassify.getIcons())){
				continue;
			}
			resCla = new IconClassify();
			resCla.setPlaceId(iconClassify.getPlaceId());
			resCla.setPlaceName(iconClassify.getPlaceName());
			resCla.setClassifyId(iconClassify.getClassifyId());
			resCla.setTitle(iconClassify.getTitle());
			resCla.setClassifyIdx(iconClassify.getClassifyIdx());
			List<IconInfo> resultIconList = new ArrayList<IconInfo>();
			for(IconInfo iconInfo : iconClassify.getIcons()){
				//|| iconInfo.getRoleList().contains(0) 改为只有指定角色并且版本号大于等于配置最小版本号才能显示
				if(iconInfo.getRoleList().contains(role) && (iconInfo.getAppVersionMin() == 0 || (iconInfo.getAppVersionMin() > 0 && appVersion >= iconInfo.getAppVersionMin()))){
					resultIconList.add(iconInfo);
				}
			}
			//如果存在图标 但是用户权限不足 也不返回分类
			if(resultIconList.isEmpty()){
				continue;
			}
			resCla.setIcons(resultIconList);
			result.add(resCla);
		}
		return ResponseHandler.list(result);
	}

	public void load(){
		try {
			//没有配置图标
			List<Map<String,Object>> iconList = iconModel.iconInfoList();
			if(StringHandler.isEmpty(iconList)){
				map = new HashMap<>();
				return;
			}
			//遍历数据，组装数据格式 位置id+端：图标分类列表
			Map<String, List<IconClassify>> objectMap = new HashMap<>();
			List<IconClassify> list;
			IconClassify iconCla;
			for(Map<String,Object> iconInfoMap : iconList){
				//组装图标信息
				String key = iconInfoMap.get("placeId") + "_" + iconInfoMap.get("post");
				IconInfo iconInfo = JsonUtil.mapToBean(iconInfoMap, IconInfo.class);
				iconInfo.setRoleList(Arrays.stream(iconInfo.getRole().split(",")).map(StringHandler::getInt).collect(Collectors.toList()));
				//组装分类信息
				iconCla = new IconClassify();
				iconCla.setPlaceId(StringHandler.getInt(iconInfoMap.get("placeId")));
				iconCla.setPlaceName(StringHandler.getString(iconInfoMap.get("placeName")));
				iconCla.setClassifyId(StringHandler.getInt(iconInfoMap.get("classifyId")));
				iconCla.setTitle(StringHandler.getString(iconInfoMap.get("classifyName")));
				iconCla.setClassifyIdx(StringHandler.getInt(iconInfoMap.get("classifyIdx")));
				//验证该位置是否存在
				if(!objectMap.containsKey(key)){
					//初始化分类图标列表数据
					iconCla.getIcons().add(iconInfo);
					//给该位置初始化图标分类的图标列表
					list = new ArrayList<>();
					list.add(iconCla);
					objectMap.put(key, list);
					continue;
				}
				List<IconClassify> iconClassifies = objectMap.get(key);
				boolean flag = true;
				for(IconClassify iconClassify:iconClassifies){
					//验证该分类是否存在
					if(iconClassify.getClassifyId()==StringHandler.getInt(iconInfoMap.get("classifyId"))){
						//给该位置增加图标分类列表
						iconClassify.getIcons().add(iconInfo);
						flag = false;
						continue;
					}
				}
				if(flag){
					//初始化分类图标信息
					iconCla.getIcons().add(iconInfo);
					//给该位置初始化图标分类列表
					objectMap.get(key).add(iconCla);
					continue;
				}

			}
			map = objectMap;
		} catch (Exception e) {
			Logger.error("加载icon列表", e);
		}
	}

}

